#include "Token.h"

#include <string>
#include "../../utils/log.h"

Token Token::SELECT = Token("SELECT", 1);
Token Token::DELETE = Token("DELETE", 2);
Token Token::INSERT = Token("INSERT", 3);
Token Token::UPDATE = Token("UPDATE", 4);

Token Token::FROM = Token("FROM", 5);
Token Token::HAVING = Token("HAVING", 6);
Token Token::WHERE = Token("WHERE", 7);
Token Token::ORDER = Token("ORDER", 8);
Token Token::BY = Token("BY", 9);
Token Token::GROUP = Token("GROUP", 10);
Token Token::INTO = Token("INTO", 11);
Token Token::AS = Token("AS", 12);

Token Token::CREATE = Token("CREATE", 13);
Token Token::ALTER = Token("ALTER", 14);
Token Token::DROP = Token("DROP", 15);
Token Token::SET = Token("SET", 16);

Token Token::XNULL = Token("NULL", 17);
Token Token::NOT = Token("NOT", 18);
Token Token::DISTINCT = Token("DISTINCT", 19);

Token Token::TABLE = Token("TABLE", 20);
Token Token::TABLESPACE = Token("TABLESPACE", 21);
Token Token::VIEW = Token("VIEW", 22);
Token Token::SEQUENCE = Token("SEQUENCE", 23);
Token Token::TRIGGER = Token("TRIGGER", 24);
Token Token::USER = Token("USER", 25);
Token Token::INDEX = Token("INDEX", 26);
Token Token::SESSION = Token("SESSION", 27);
Token Token::PROCEDURE = Token("PROCEDURE", 28);
Token Token::FUNCTION = Token("FUNCTION", 29);

Token Token::PRIMARY = Token("PRIMARY", 30);
Token Token::KEY = Token("KEY", 31);
Token Token::DEFAULT = Token("DEFAULT", 32);
Token Token::CONSTRAINT = Token("CONSTRAINT", 33);
Token Token::CHECK = Token("CHECK", 34);
Token Token::UNIQUE = Token("UNIQUE", 35);
Token Token::FOREIGN = Token("FOREIGN", 36);
Token Token::REFERENCES = Token("REFERENCES", 37);

Token Token::EXPLAIN = Token("EXPLAIN", 38);
Token Token::FOR = Token("FOR", 39);
Token Token::IF = Token("IF", 40);

Token Token::LOCAL = Token("LOCAL", 41);
Token Token::GLOBAL = Token("GLOBAL", 42);
Token Token::ALL = Token("ALL", 43);
Token Token::UNION = Token("UNION", 44);
Token Token::EXCEPT = Token("EXCEPT", 45);
Token Token::INTERSECT = Token("INTERSECT", 46);
Token Token::MINUS = Token("MINUS", 47);
Token Token::INNER = Token("INNER", 48);
Token Token::LEFT = Token("LEFT", 49);
Token Token::RIGHT = Token("RIGHT", 50);
Token Token::FULL = Token("FULL", 51);
Token Token::OUTER = Token("OUTER", 52);
Token Token::JOIN = Token("JOIN", 53);
Token Token::STRAIGHT_JOIN = Token("STRAIGHT_JOIN", 54);
Token Token::ON = Token("ON", 55);
Token Token::SCHEMA = Token("SCHEMA", 56);
Token Token::CAST = Token("CAST", 57);
Token Token::COLUMN = Token("COLUMN", 58);
Token Token::USE = Token("USE", 59);
Token Token::DATABASE = Token("DATABASE", 60);
Token Token::TO = Token("TO", 61);

Token Token::AND = Token("AND", 62);
Token Token::OR = Token("OR", 63);
Token Token::XOR = Token("XOR", 64);
Token Token::CASE = Token("CASE", 65);
Token Token::WHEN = Token("WHEN", 66);
Token Token::THEN = Token("THEN", 67);
Token Token::ELSE = Token("ELSE", 68);
Token Token::ELSIF = Token("ELSIF", 69);
Token Token::END = Token("END", 70);
Token Token::EXISTS = Token("EXISTS", 71);
Token Token::IN = Token("IN", 72);

Token Token::NEW = Token("NEW", 73);
Token Token::ASC = Token("ASC", 74);
Token Token::DESC = Token("DESC", 75);
Token Token::IS = Token("IS", 76);
Token Token::LIKE = Token("LIKE", 77);
Token Token::ESCAPE = Token("ESCAPE", 78);
Token Token::BETWEEN = Token("BETWEEN", 79);
Token Token::VALUES = Token("VALUES", 80);
Token Token::INTERVAL = Token("INTERVAL", 81);

Token Token::LOCK = Token("LOCK", 82);
Token Token::SOME = Token("SOME", 83);
Token Token::ANY = Token("ANY", 84);
Token Token::TRUNCATE = Token("TRUNCATE", 85);

Token Token::RETURN = Token("RETURN", 86);

// mysql
Token Token::XTRUE = Token("TRUE", 87);
Token Token::XFALSE = Token("FALSE", 88);
Token Token::LIMIT = Token("LIMIT", 89);
Token Token::KILL = Token("KILL", 90);
Token Token::IDENTIFIED = Token("IDENTIFIED", 91);
Token Token::PASSWORD = Token("PASSWORD", 92);
Token Token::DUAL = Token("DUAL", 93);
Token Token::BINARY = Token("BINARY", 94);
Token Token::SHOW = Token("SHOW", 95);
Token Token::REPLACE = Token("REPLACE", 96);
Token Token::PERIOD = Token("PERIOD", 97);

Token Token::BITS = Token("BITS", 0);

// MySql procedure add by zz
Token Token::WHILE = Token("WHILE", 98);
Token Token::DO = Token("DO", 99);
Token Token::LEAVE = Token("LEAVE", 100);
Token Token::ITERATE = Token("ITERATE", 101);
Token Token::REPEAT = Token("REPEAT", 102);
Token Token::UNTIL = Token("UNTIL", 103);
Token Token::OPEN = Token("OPEN", 104);
Token Token::CLOSE = Token("CLOSE", 105);
Token Token::OUT = Token("OUT", 106);
Token Token::INOUT = Token("INOUT", 107);
Token Token::EXIT = Token("EXIT", 108);
Token Token::UNDO = Token("UNDO", 109);
Token Token::SQLSTATE = Token("SQLSTATE", 110);
Token Token::CONDITION = Token("CONDITION", 111);
Token Token::DIV = Token("DIV", 112);

// postgresql
Token Token::WINDOW = Token("WINDOW", 113);
Token Token::OFFSET = Token("OFFSET", 114);
Token Token::ROW = Token("ROW", 115);
Token Token::ROWS = Token("ROWS", 116);
Token Token::ONLY = Token("ONLY", 117);
Token Token::FIRST = Token("FIRST", 118);
Token Token::NEXT = Token("NEXT", 119);
Token Token::FETCH = Token("FETCH", 120);
Token Token::OF = Token("OF", 121);
Token Token::SHARE = Token("SHARE", 122);
Token Token::NOWAIT = Token("NOWAIT", 123);
Token Token::RECURSIVE = Token("RECURSIVE", 124);
Token Token::TEMPORARY = Token("TEMPORARY", 125);
Token Token::TEMP = Token("TEMP", 126);
Token Token::UNLOGGED = Token("UNLOGGED", 127);
Token Token::RESTART = Token("RESTART", 128);
Token Token::IDENTITY = Token("IDENTITY", 129);
Token Token::CONTINUE = Token("CONTINUE", 130);
Token Token::CASCADE = Token("CASCADE", 131);
Token Token::RESTRICT = Token("RESTRICT", 132);
Token Token::USING = Token("USING", 133);
Token Token::CURRENT = Token("CURRENT", 134);
Token Token::RETURNING = Token("RETURNING", 135);
Token Token::COMMENT = Token("COMMENT", 136);
Token Token::OVER = Token("OVER", 137);
Token Token::TYPE = Token("TYPE", 138);
Token Token::ILIKE = Token("ILIKE", 139);
Token Token::RLIKE = Token("RLIKE", 140);
Token Token::FULLTEXT = Token("FULLTEXT", 141);

// oracle
Token Token::START = Token("START", 142);
Token Token::PRIOR = Token("PRIOR", 143);
Token Token::CONNECT = Token("CONNECT", 144);
Token Token::WITH = Token("WITH", 145);
Token Token::EXTRACT = Token("EXTRACT", 146);
Token Token::CURSOR = Token("CURSOR", 147);
//    MODEL = Token("MODEL");
Token Token::MERGE = Token("MERGE", 148);
Token Token::MATCHED = Token("MATCHED", 149);
Token Token::ERRORS = Token("ERRORS", 150);
Token Token::REJECT = Token("REJECT", 151);
Token Token::UNLIMITED = Token("UNLIMITED", 152);
Token Token::BEGIN = Token("BEGIN", 153);
Token Token::EXCLUSIVE = Token("EXCLUSIVE", 154);
Token Token::MODE = Token("MODE", 155);
Token Token::WAIT = Token("WAIT", 156);
Token Token::ADVISE = Token("ADVISE", 157);
Token Token::SYSDATE = Token("SYSDATE", 158);
Token Token::DECLARE = Token("DECLARE", 159);
Token Token::EXCEPTION = Token("EXCEPTION", 160);
Token Token::GRANT = Token("GRANT", 161);
Token Token::REVOKE = Token("REVOKE", 162);
Token Token::LOOP = Token("LOOP", 163);
Token Token::GOTO = Token("GOTO", 164);
Token Token::COMMIT = Token("COMMIT", 165);
Token Token::SAVEPOINT = Token("SAVEPOINT", 166);
Token Token::CROSS = Token("CROSS", 167);

Token Token::PCTFREE = Token("PCTFREE", 168);
Token Token::INITRANS = Token("INITRANS", 169);
Token Token::MAXTRANS = Token("MAXTRANS", 170);
Token Token::INITIALLY = Token("INITIALLY", 171);
Token Token::ENABLE = Token("ENABLE", 172);
Token Token::DISABLE = Token("DISABLE", 173);
Token Token::SEGMENT = Token("SEGMENT", 174);
Token Token::CREATION = Token("CREATION", 175);
Token Token::IMMEDIATE = Token("IMMEDIATE", 176);
Token Token::DEFERRED = Token("DEFERRED", 177);
Token Token::STORAGE = Token("STORAGE", 178);
Token Token::MINEXTENTS = Token("MINEXTENTS", 179);
Token Token::MAXEXTENTS = Token("MAXEXTENTS", 180);
Token Token::MAXSIZE = Token("MAXSIZE", 181);
Token Token::PCTINCREASE = Token("PCTINCREASE", 182);
Token Token::FLASH_CACHE = Token("FLASH_CACHE", 183);
Token Token::CELL_FLASH_CACHE = Token("CELL_FLASH_CACHE", 184);
Token Token::NONE = Token("NONE", 185);
Token Token::LOB = Token("LOB", 186);
Token Token::STORE = Token("STORE", 187);
Token Token::CHUNK = Token("CHUNK", 188);
Token Token::CACHE = Token("CACHE", 189);
Token Token::NOCACHE = Token("NOCACHE", 190);
Token Token::LOGGING = Token("LOGGING", 191);
Token Token::NOCOMPRESS = Token("NOCOMPRESS", 192);
Token Token::KEEP_DUPLICATES = Token("KEEP_DUPLICATES", 193);
Token Token::EXCEPTIONS = Token("EXCEPTIONS", 194);
Token Token::PURGE = Token("PURGE", 195);

Token Token::COMPUTE = Token("COMPUTE", 196);
Token Token::ANALYZE = Token("ANALYZE", 197);
Token Token::OPTIMIZE = Token("OPTIMIZE", 198);

// transact-sql
Token Token::TOP = Token("TOP", 199);

Token Token::ARRAY = Token("ARRAY", 200);
Token Token::DISTRIBUTE = Token("DISTRIBUTE", 201);

// hive

Token Token::XEOF = Token("EOF", 0);
Token Token::ERROR = Token("ERROR", 0);
Token Token::IDENTIFIER = Token("IDENTIFIER", 0);
Token Token::HINT = Token("HINT", 0);
Token Token::VARIANT = Token("VARIANT", 0);
Token Token::LITERAL_INT = Token("LITERAL_INT", 0);
Token Token::LITERAL_FLOAT = Token("LITERAL_FLOAT", 0);
Token Token::LITERAL_HEX = Token("LITERAL_HEX", 0);
Token Token::LITERAL_CHARS = Token("LITERAL_CHARS", 0);
Token Token::LITERAL_NCHARS = Token("LITERAL_NCHARS", 0);

Token Token::CODE = Token("CODE", 0); // odps

Token Token::LITERAL_PATH = Token("LITERAL_PATH", 0);

Token Token::LITERAL_ALIAS = Token("LITERAL_ALIAS", 0);
Token Token::LINE_COMMENT = Token("LINE_COMMENT", 0);
Token Token::MULTI_LINE_COMMENT = Token("MULTI_LINE_COMMENT", 0);

// Oracle
Token Token::BINARY_FLOAT = Token("BINARY_FLOAT", 0);
Token Token::BINARY_DOUBLE = Token("BINARY_DOUBLE", 0);

// odps;hive
Token Token::PARTITION = Token("PARTITION", 0);
Token Token::PARTITIONED = Token("PARTITIONED", 0);
Token Token::OVERWRITE = Token("OVERWRITE", 0);
Token Token::SORT = Token("SORT", 0);
Token Token::LATERAL = Token("LATERAL", 0);

// Teradata
Token Token::SEL = Token("SEL", 202);
Token Token::LOCKING = Token("LOCKING", 203);
Token Token::ACCESS = Token("ACCESS", 204);
Token Token::VOLATILE = Token("VOLATILE", 205);
Token Token::MULTISET = Token("MULTISET", 206);
Token Token::POSITION = Token("POSITION", 207);
Token Token::RANGE_N = Token("RANGE_N", 208);
Token Token::FORMAT = Token("FORMAT", 209);
Token Token::QUALIFY = Token("QUALIFY", 210);
Token Token::MOD = Token("MOD", 211);
Token Token::CONTAINS = Token("CONTAINS", 212);

Token Token::CONCAT = Token("CONCAT", 213); // DB2

Token Token::UPSERT = Token("UPSERT", 214); // Phoenix

// StarRocks
Token Token::BIGINT = Token("BIGINT", 215);
Token Token::BITMAP = Token("BITMAP", 216);

Token Token::LPAREN = Token("(", 217);
Token Token::RPAREN = Token(")", 218);
Token Token::LBRACE = Token("{", 219);
Token Token::RBRACE = Token("}", 220);
Token Token::LBRACKET = Token("[", 221);
Token Token::RBRACKET = Token("]", 222);
Token Token::SEMI = Token(";", 223);
Token Token::COMMA = Token(";", 224);
Token Token::DOT = Token(".", 225);
Token Token::DOTDOT = Token("..", 226);
Token Token::DOTDOTDOT = Token("..;", 227);
Token Token::EQ = Token("=", 228);
Token Token::GT = Token(">", 229);
Token Token::LT = Token("<", 230);
Token Token::LT_SUB_GT = Token("<->", 231);
Token Token::BANG = Token("!", 232);
Token Token::BANGBANG = Token("!!", 233);
Token Token::BANG_TILDE = Token("!~", 234);
Token Token::BANG_TILDE_STAR = Token("!~*", 235);
Token Token::TILDE = Token("~", 236);
Token Token::TILDE_STAR = Token("~*", 237);
Token Token::TILDE_EQ = Token("~=", 238);
Token Token::QUES = Token("?", 239);
Token Token::QUESQUES = Token("??", 240);
Token Token::QUESBAR = Token("?|", 241);
Token Token::QUESAMP = Token("?&", 242);
Token Token::COLON = Token(":", 243);
Token Token::COLONCOLON = Token("::", 244);
Token Token::COLONEQ = Token(":=", 245);
Token Token::EQEQ = Token("==", 246);
Token Token::EQGT = Token("=>", 247);
Token Token::LTEQ = Token("<=", 248);
Token Token::LTEQGT = Token("<=>", 249);
Token Token::LTGT = Token("<>", 250);
Token Token::GTEQ = Token(">=", 251);
Token Token::BANGEQ = Token("!=", 252);
Token Token::BANGGT = Token("!>", 253);
Token Token::BANGLT = Token("!<", 254);
Token Token::AMPAMP = Token("&&", 255);
Token Token::BARBAR = Token("||", 256);
Token Token::BARBARSLASH = Token("||/", 257);
Token Token::BARSLASH = Token("|/", 258);
Token Token::PLUS = Token("+", 259);
Token Token::SUB = Token("-", 260);
Token Token::SUBGT = Token("->", 261);
Token Token::SUBGTGT = Token("->>", 262);
Token Token::STAR = Token("*", 263);
Token Token::SLASH = Token("/", 264);
Token Token::AMP = Token("&", 265);
Token Token::BAR = Token("|", 266);
Token Token::CARET = Token("^", 267);
Token Token::CARETEQ = Token("^=", 268);
Token Token::PERCENT = Token("%", 269);
Token Token::LTLT = Token("<<", 270);
Token Token::GTGT = Token(">>", 271);
Token Token::MONKEYS_AT = Token("@", 272);
Token Token::MONKEYS_AT_AT = Token("@@", 273);
Token Token::POUND = Token("#", 274);
Token Token::POUNDGT = Token("#>", 275);
Token Token::POUNDGTGT = Token("#>>", 276);
Token Token::MONKEYS_AT_GT = Token("@>", 277);
Token Token::LT_MONKEYS_AT = Token("<@", 278);

Token Token::NO_EXISTING_TOKEN = Token("NO_EXISTING_TOKEN", 999);

Token::Token()
{
  Token("", 0);
}

Token::~Token()
{
  // LOG_INFO << "name:" << name ;
  // LOG_INFO << "index:" << index;
}

Token::Token(Token *token)
{
  this->name = token->name;
  this->index = token->index;
}

Token::Token(const char *name, uint64_t index)
{
  // LOG_INFO << "Token[" << name << "]:" << index;
  this->name = make_string_ptr(name);
  this->index = index;
}

Token::Token(string_ptr name, uint64_t index)
{
  LOG_INFO << "Token[" << name << "]:" << index;
  this->name = name;
  this->index = index;
}

bool Token::operator==(const Token &ps)
{
  if ((this->name == ps.name) &&
      (this->index == ps.index))
  {
    return true;
  }
  return false;
}

bool Token::operator!=(const Token &ps)
{
  if ((this->name != ps.name) ||
      (this->index != ps.index))
  {
    return true;
  }
  return false;
}

uint64_t Token::get_index()
{
  return index;
}